package com.junlong0716.enjoylearning

import com.junlong0716.enjoylearning.entity.AccountEntity
import com.junlong0716.enjoylearning.manager.UserManager
import com.junlong0716.module.common.BaseApplication
import com.junlong0716.module.common.BuildConfig
import com.lzy.okgo.OkGo
import com.lzy.okgo.cache.CacheEntity
import com.lzy.okgo.cache.CacheMode
import com.lzy.okgo.cookie.CookieJarImpl
import com.lzy.okgo.cookie.store.DBCookieStore
import com.lzy.okgo.interceptor.HttpLoggingInterceptor
import com.orhanobut.logger.Logger
import io.reactivex.Observable
import io.reactivex.ObservableOnSubscribe
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import io.realm.Realm
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
import java.util.logging.Level
import io.realm.RealmConfiguration




/**
 *@author: 巴黎没有摩天轮Li
 *@description:
 *@date: Created in 下午4:36 2018/4/25
 *@modified by:
 */
open class MyApp : BaseApplication() {

    //用户登录信息（token）
    var userAccount: AccountEntity? = null
        private set

    companion object {
        private var instance: MyApp? = null
        fun instance() = instance!!
    }

    override fun onCreate() {
        super.onCreate()

        initOkGo()

        instance = this

        //初始化UserAccount数据
        getUserAccount()

        Realm.init(this)
        val config = RealmConfiguration.Builder().name("db.realm").schemaVersion(0).build()
        Realm.setDefaultConfiguration(config)
    }

    private fun initOkGo() {
        val builder = OkHttpClient.Builder()


        val loggingInterceptor = HttpLoggingInterceptor("OkGo")
        loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY)       //log打印级别，决定了log显示的详细程度
        loggingInterceptor.setColorLevel(Level.INFO)                             //log颜色级别，决定了log在控制台显示的颜色
        builder.addInterceptor(loggingInterceptor)                             //添加OkGo默认debug日志 3 //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0

        //超时时间设置，默认60秒
        builder.readTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);      //全局的读取超时时间
        builder.writeTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);     //全局的写入超时时间
        builder.connectTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);   //全局的连接超时时间

        builder.cookieJar(CookieJarImpl(DBCookieStore(this)));              //使用数据库保持cookie，如果cookie不过期，则一直有效


        // 其他统一的配置
        // 详细说明看GitHub文档：https://github.com/jeasonlzy/
        OkGo.getInstance().init(this)                           //必须调用初始化
                .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置会使用默认的
                .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                .setRetryCount(3)                               //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0
        //.addCommonHeaders(headers)                      //全局公共头
        //.addCommonParams(params);                       //全局公共参数

    }



    //存入账号信息
    fun putUserAccount(userAccount: AccountEntity) {
        this.userAccount = userAccount
        UserManager.putUserAccount(userAccount)
    }

    //获取账户信息
    private fun getUserAccount() {
        this.userAccount = UserManager.getUserAccount()
    }
}